原理就是这么简单- Softmax

问题介绍

一般的神经网络课程在讲述BP算法的时候都会用sigmoid 函数来作为最后一层的激活函数来实现二分类,这是因为其sigmoid求导的便利,非常适合用来讲课(吴大大的课也是如此)。

但是对于多分类的问题很多小伙伴表示喜欢直接调库。其实了解softmax反向传播原理,或者可以自己手推一遍softmax的BP算法,才能彰显一个AI从业人员的内功。

此文会通过一个案例为大家一步一步讲解softmax 反向传播的多个知识点,只要仔细看完此文你会对整个流程豁然开朗。

现有如下的分类问题,可以通过动物的4个特征来区分此动物到底是什么种类(猫,狗,人 3个类别)

我们可以建立如下NN模型来解决这个问题:

image 

统一命名

在开始讲解之前,首先定义一下此文的统一符号命名,(很重要)

红色的是Input 简写为

蓝色的是Output 简写为 O

红色和蓝色之间的是权重矩阵 简写为 W

绿色的是Output经过Softmax之后的结果 简写为 yhat

正向传播

O = X W

yhat = Softmax(O)

@image 此时softmax 有三个神经元输出 m = 3

重要

X (Shape 为(1,4)的向量)

W (Shape为(4,3)的矩阵)

yhat (Shape 为(1,3)的向量)

反向传播

1) 求损失

因为是分类问题,我们采用交叉熵作为 loss function(关于为什么交叉熵可以作为损失函数我会在后期写一篇文章进行介绍,敬请期待), 如下:

image 

2) 求梯度

我先给出梯度公式也就是项目中的error-term :

x⋅(yhaty)

想必各位想知道这个公式到底怎么推导得到的呢?

接下来我会讲解此文的重点

重要 求权重的梯度需要运用链式求导法则,如下:

image 

我们来分别计算后面的三项:

第一项:

image 

第二项:

稍微有点复杂。

为什么yhat下标为i 而O下标为j 呢?

这是由于softmax 函数的分母有多个输出,但是针对yhati 需要计算所有的softmax

由于softmax有多个输出,所以需要考虑 i = j 与 i != j 两种情形。

当 i != j 时:

image 

所以可得结果为: image 

当 i = j 时:

将 j 替换为 i如下

image 

所以可得 结果为:image 

第三项:

image 

第三项非常简单,我们先来算前两项

image 

到这里别忘了 我们经过softmax 的输出只有一个类别也就是 yi = 1, 其他的都等于0

所以前两项的结果为:image 

最终我们就得到了结果:

image 

注意

但是Error - term 为 x⋅(yhaty)

这里为什么有个负号?

是因为模型应该朝着负梯度的方向优化,所以加了一个负号。

到此softmax 的正向与反向传播都讲清楚了,欢迎支持 《原理就是这么简单系列》